// Copyright (c) 2012-2013, yuno. All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are met:
//
// 1. Redistributions of source code must retain the above copyright notice,
//    this list of conditions and the following disclaimer.
//
// 2. Redistributions in binary form must reproduce the above copyright notice,
//    this list of conditions and the following disclaimer in the documentation
//    and/or other materials provided with the distribution.
//
// 3. Neither the name of the copyright holder nor the names of contributors
//    may be used to endorse or promote products derived from this software
//    without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// POSSIBILITY OF SUCH DAMAGE.
//
package sugarmintcandy.widgetwindow;

import android.app.Application;
import android.content.ComponentName;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.pm.PackageManager;
import android.preference.PreferenceManager;

public class MainApplication extends Application implements
	PurchaseStateListener,
	SharedPreferences.OnSharedPreferenceChangeListener {
    private MainDatabase mDatabase;
    private MyAppWidgetHostManager mHostManager;
    private BillingService mBillingService;
    private SharedPreferences mPreferences;

    @Override
    public void onCreate() {
	super.onCreate();
	PreferenceKeys.initDefaultValues(this);
	mDatabase = new MainDatabase(this);
	mHostManager = new MyAppWidgetHostManager(mDatabase);
	ControlWidget.doUpdate(this);
	getPackageManager().setComponentEnabledSetting(
		new ComponentName(this, MainBroadcastReceiver.class),
		PackageManager.COMPONENT_ENABLED_STATE_DEFAULT,
		PackageManager.DONT_KILL_APP);
	mBillingService = new BillingService(this);
	mBillingService.registerPurchaseStateListener(this);
	mPreferences = PreferenceManager.getDefaultSharedPreferences(this);
	mPreferences.registerOnSharedPreferenceChangeListener(this);
	if (shouldServiceRun()) {
	    startService(new Intent(this, MainService.class));
	}
    }

    @Override
    public void onTerminate() {
	super.onTerminate();
	mDatabase.close();
	mBillingService.unregisterPurchaseStateListener(this);
	mBillingService.shutdown();
	mPreferences.unregisterOnSharedPreferenceChangeListener(this);
    }

    @Override
    public void onLowMemory() {
	super.onLowMemory();
	mDatabase.close();
    }

    public MainDatabase getDatabase() {
	return mDatabase;
    }

    public MyAppWidgetHostManager getHostManager() {
	return mHostManager;
    }

    public BillingService getBillingService() {
	return mBillingService;
    }

    @Override
    public void onPurchaseStateChanged(String orderId, String productId,
	    int state) {
	if (Constants.PRODUCT_DONATION.equals(productId)) {
	    SharedPreferences.Editor editor = PreferenceManager
		    .getDefaultSharedPreferences(this).edit();
	    editor.putInt(PreferenceKeys.DONATION_STATE, state);
	    editor.commit();
	}
    }

    @Override
    public void onSharedPreferenceChanged(SharedPreferences sharedPreferences,
	    String key) {
	if (PreferenceKeys.SHOW_NOTIFICATION.equals(key)) {
	    boolean value = mPreferences.getBoolean(
		    PreferenceKeys.SHOW_NOTIFICATION, false);
	    if (value) {
		Intent intent = new Intent(this, MainService.class);
		intent.setAction(Constants.ACTION_SHOW_NOTIFICATION);
		startService(intent);
	    } else {
		Intent intent = new Intent(this, MainService.class);
		intent.setAction(Constants.ACTION_HIDE_NOTIFICATION);
		startService(intent);
	    }
	}
	if (PreferenceKeys.CURRENT_WORKSPACE.equals(key)) {
	    Intent intent = new Intent(this, MainService.class);
	    intent.setAction(Constants.ACTION_SWITCH_WORKSPACE);
	    startService(intent);
	    ControlWidget.doUpdate(this);
	}
	if (PreferenceKeys.ANCHOR.equals(key)) {
	    mDatabase.updateAnchor();
	}
    }

    private boolean shouldServiceRun() {
	MainDatabase db = getDatabase();
	if (db.getNumberOfWindows() > 0) {
	    return true;
	}
	SharedPreferences prefs = PreferenceManager
		.getDefaultSharedPreferences(this);
	if (prefs.getBoolean(PreferenceKeys.SHOW_NOTIFICATION, false)) {
	    return true;
	}
	return false;
    }
}
